package main

import (
	"devopsapi/global"
	"devopsapi/middleware"
	"devopsapi/pkg/util/emails"
	router "devopsapi/routers"
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"golang.org/x/sync/errgroup"
)

// 处理属于同一总体任务的子任务的goroutine的集合
var (
	g errgroup.Group
)

// init 初始化项目配置以及数据库连接池
func init() {
	global.SetupConfig("release")
	emails.NewEmailer()
}

func main() {
	// 指定 gin 运行模式
	gin.SetMode(global.App.Mode)

	// 返回一个新的空白Engine实例
	r := gin.New()

	// 设置日志中间件
	r.Use(middleware.Logger())

	// 加载自定义路由
	router.Load(r)

	// Linux、Mac 环境下使用 fvbock/endless 艰辛平滑重启
	// err := endless.ListenAndServe(fmt.Sprintf("%s:%d", global.App.Host, global.App.Port), r)
	// if err != nil || err != http.ErrServerClosed {
	// 	log.Println("err:", err)
	// }

	// W通用：开放监听运行Gin服务
	server := &http.Server{
		// Gin运行的监听端口
		Addr: fmt.Sprintf("%s:%d", global.App.Host, global.App.Port),
		// 要调用的处理程序，http.DefaultServeMux如果为nil
		Handler: r,
		// ReadTimeout是读取整个请求（包括正文）的最长持续时间。
		ReadTimeout: 5 * time.Second,
		// WriteTimeout是超时写入响应之前的最长持续时间
		WriteTimeout: 10 * time.Second,
		// MaxHeaderBytes控制服务器解析请求标头的键和值（包括请求行）时读取的最大字节数 (通常情况下不进行设置)
		MaxHeaderBytes: 1 << 20,
	}
	// 在一个新的goroutine中调用给定的函数
	g.Go(func() error {
		return server.ListenAndServe()
	})

	if err := g.Wait(); err != nil {
		log.Fatal(err)
	}
}
